/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.pessoas.collection;

import AcessoBD.AcessoBD;
import com.pessoas.collection.observer.Observer;
import com.pessoas.model.Pessoa;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;

/**
 *
 * @author Caio Valentim
 */
public class PessoaDAOSQL  extends IPessoaDAO{
    
     private PreparedStatement ps;
     private Connection con;    
     private ResultSet rs;
     private AcessoBD acessoBD = new AcessoBD();
     private String incluiPessoa = "insert into pessoa (nome,telefone) values(?, ?)";
     private String incluiTodos = "insert into pessoa (nome,telefone) values(?, ?)";
     private String alteraPessoa = "update pessoa set nome = ?, telefone = ?";
     private String excluiPessoa = "delete from pessoa where pessoa.nome = ?";
     private String consultaPessoaNome = "select * from pessoa where pessoa.nome like ?";
     private String listarPessoas= "select * from pessoa";
     private Pessoa p;
     
      private TreeSet<Pessoa> pessoas = null;
     
     
    @Override
    public boolean add(Pessoa p) throws IOException {
      try {
            con = acessoBD.conectar();
            ps = con.prepareStatement(incluiPessoa);
            ps.setString(1, p.getNome());
            ps.setString(2, p.getTelefone());
            ps.executeUpdate();
            
            acessoBD.desconectar();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    
      

    @Override
    public void addAll(TreeSet pessoas) throws IOException {
        try {
            con = acessoBD.conectar();
            for (Iterator it = pessoas.iterator(); it.hasNext();) {
                Object object = it.next();
                ps = con.prepareStatement(incluiTodos);
                ps.setString(1, p.getNome());
                ps.setString(2, p.getTelefone());
                ps.executeUpdate();           
            }        
            acessoBD.desconectar();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void addObserver(Observer observer) {
        observadores.add(observer);
    }

    @Override
    public boolean altera(Pessoa pessoaExistente, String nomeAnterior) throws IOException {
        try {
            con = acessoBD.conectar();
            ps = con.prepareStatement(alteraPessoa);
 
            ps.setString(1, pessoaExistente.getNome());
            ps.setString(2, pessoaExistente.getTelefone());         
            ps.executeUpdate();

            acessoBD.desconectar();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    @Override
    public void carregaPessoas() throws FileNotFoundException {
            try {
            con = acessoBD.conectar();
            ps = con.prepareStatement(listarPessoas);
            rs = ps.executeQuery();
            while (rs.next()) {
                p = new Pessoa("","");
                p.setNome(rs.getString("nome"));
                p.setTelefone(rs.getString("telefone"));           
                pessoas.add(p);
            }
            acessoBD.desconectar();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public boolean contains(Pessoa p) {
        return this.pessoas.contains(p);
    }

    @Override
    public Pessoa getPessoaByName(String nome) {
         Pessoa pessoa;
         try {
            con = acessoBD.conectar();
            ps = con.prepareStatement(consultaPessoaNome);
            nome = nome;
            ps.setString(1, nome);
            rs = ps.executeQuery();
             pessoa = new Pessoa("","");
            while (rs.next()) {          
                pessoa.setNome(rs.getString("nome"));
                pessoa.setTelefone(rs.getString("telefone"));
                return pessoa;
            }
            acessoBD.desconectar();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public TreeSet getTreeSet() {
        return pessoas;
    }

    @Override
    public void notifyObservers() {
       for (Iterator<Observer> it = observadores.iterator(); it.hasNext();) {
            Observer observer = it.next();
            observer.update(this.getTreeSet());
        }
    }

    @Override
    public boolean remove(String nome) throws IOException {
        try {
            p.setNome(nome);
            con = acessoBD.conectar();
            ps = con.prepareStatement(excluiPessoa);
            ps.setString(1, p.getNome());
            ps.executeUpdate();
            acessoBD.desconectar();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return false;
    }
    
}
